import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data=pd.read_csv("链家北京租房数据.csv", encoding='gbk')
print(data.head())

# 预处理
# 重复值
print(len(data))
data=data.drop_duplicates()
print(data.loc[data.duplicated()])
# 缺失值
data=data.dropna()
#数据转型
# 面积提取数字
mianji=np.array([])
for i in data["面积(㎡)"].values:
    mianji=np.append(mianji,np.array(i[:-2]))
mianji=mianji.astype(np.float64)
data.loc[:,"面积(㎡)"]=mianji
print(data.head())
# 户型的房间替换为室
fangjian=[]
for i in data["户型"]:
    fangjian.append(i.replace('房间','室'))
data.loc[:,'户型']=fangjian
print(data.tail())

# 统计计算
# 房源数量和位置
area_data=data.groupby('区域').count()
data['位置']='北京市'+data['区域'].values+'区'+data['小区名称'].values
print(data.head())
# 户型数量
def all_house(arr):
    key=np.unique(np.array(arr))
    r={}
    for k in key:
        r[k]=arr[arr==k].size
    return r

info_data=all_house(data['户型'])
print(info_data)
info_data=dict((k,v) for k,v in info_data.items() if v>50)
print(info_data)
info_house=pd.DataFrame({'户型':[x for x in info_data.keys()],'数量':[x for x in info_data.values()]})
print(info_house)
# 平均租金
sum_price=data.groupby('区域')["价格(元/月)"].sum()
sum_area=data.groupby('区域')["面积(㎡)"].sum()
price_data=pd.DataFrame({'区域':sum_price.keys(),'总租金':sum_price.values,'总面积':sum_area.values})
price_data['每平米租金']=price_data['总租金'] / price_data['总面积']
print(price_data.head())
# 面积
area_div=[1,30,50,70,90,120,140,160,1200]
area_cut=pd.cut(list(data["面积(㎡)"]),area_div)
print(area_cut.describe()['freqs'])
area_cut_data=area_cut.describe()['freqs']
# 可视化
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
# 房源数量
area_data['户型'].plot(kind='bar',title="北京各区房源数量")
plt.show()

# 位置:热力图(略)
# 户型数量
info_house=info_house.set_index('户型')
info_house.plot(kind="bar",title='北京各户型数量')
plt.show()
# 平均租金
price_data=price_data.set_index('区域')
price_data['每平米租金'].plot(kind='bar',title='北京各区平均租金')
plt.show()
# 面积
area_cut_data.plot(kind="pie",labels=["30平米以下","30~50平米","50~70平米","70~90平米","90~120平米",
                                      "120~140平米","140~160平米","160平米以上"],title="北京各面积占比")
plt.show()
